package handler

import (
	GETAREA "bianwang/GetArea/proto"
	"bianwang/web/utils"
	"context"
	"encoding/json"
	"github.com/asim/go-micro/v3"
	"github.com/beego/beego/v2/core/logs"
	"github.com/julienschmidt/httprouter"
	"net/http"
	"strconv"
)

// 获取省份
func GetAreaProvince(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
	utils.AlyLog("Get", "获取地区请求客户端 url : api/v1.0/areas/GetAreaProvince")

	// 创建新的句柄
	service := micro.NewService()
	// 服务初始化
	service.Init()

	// 创建获取地区的服务并且返回句柄
	client := GETAREA.NewGetAreaService("go.micro.srv.GetArea", service.Client())

	// 调用函数并且获得返回数据
	rsp, err := client.GetAreaByProvince(context.Background(), &GETAREA.RequestProvince{})
	if err != nil {
		http.Error(w, err.Error(), 502)
		return
	}

	// 创建返回数据map
	response := map[string]interface{}{
		"code": rsp.Code,
		"msg":  rsp.Msg,
		"data": rsp.Data,
	}
	w.Header().Set("Content-Type", "application/json")

	// 将返回数据map发送给前端
	if err := json.NewEncoder(w).Encode(response); err != nil {
		http.Error(w, err.Error(), 503)
		return
	}
}

// 获取城市
func GetAreaCity(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
	utils.AlyLog("Get", "获取城市请求客户端 url : api/v1.0/areas/GetAreaCity")

	// 创建新的句柄
	service := micro.NewService()
	// 服务初始化
	service.Init()
	// 创建获取地区的服务并且返回句柄
	client := GETAREA.NewGetAreaService("go.micro.srv.GetArea", service.Client())

	code, err := strconv.ParseInt(ps.ByName("code"), 10, 64)
	if err != nil {
		http.Error(w, "缺少关键性参数code", -1)
		return
	}

	// 调用函数并且获得返回数据
	rsp, err := client.GetAreaByCity(context.Background(), &GETAREA.RequestCity{Code: code})
	if err != nil {
		http.Error(w, err.Error(), 502)
		return
	}

	// 创建返回数据map
	response := map[string]interface{}{
		"code": rsp.Code,
		"msg":  rsp.Msg,
		"data": rsp.Data,
	}
	w.Header().Set("Content-Type", "application/json")

	// 将返回数据map发送给前端
	if err := json.NewEncoder(w).Encode(response); err != nil {
		http.Error(w, err.Error(), 503)
		return
	}
}

// 获取乡镇
func GetAreaArea(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
	utils.AlyLog("Get", "获取乡镇请求客户端 url : api/v1.0/areas/GetAreaArea")

	// 创建新的句柄
	service := micro.NewService()
	// 服务初始化
	service.Init()

	// 创建获取地区的服务并且返回句柄
	client := GETAREA.NewGetAreaService("go.micro.srv.GetArea", service.Client())

	// 获取前端发送过来的区域码
	code, err := strconv.ParseInt(ps.ByName("code"), 10, 64)
	if err != nil {
		http.Error(w, "缺少关键性参数code", -1)
		return
	}
	// 调用函数并且获得返回数据
	rsp, err := client.GetAreaByArea(context.Background(), &GETAREA.RequestArea{Code: code})
	if err != nil {
		http.Error(w, err.Error(), 502)
		return
	}
	logs.Info("rsp:", rsp)

	// 创建返回数据map
	response := map[string]interface{}{
		"code": rsp.Code,
		"msg":  rsp.Msg,
		"data": rsp.Data,
	}
	w.Header().Set("Content-Type", "application/json")

	// 将返回数据map发送给前端
	if err := json.NewEncoder(w).Encode(response); err != nil {
		http.Error(w, err.Error(), 503)
		return
	}
}

// 获取街道
func GetAreaStreet(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
	utils.AlyLog("Get", "获取街道请求客户端 url : api/v1.0/areas/GetAreaStreet")
	// 创建新的句柄
	service := micro.NewService()
	// 服务初始化
	service.Init()

	// 创建获取地区的服务并且返回句柄
	client := GETAREA.NewGetAreaService("go.micro.srv.GetArea", service.Client())

	// 获取前端发送过来的区域码
	code, err := strconv.ParseInt(ps.ByName("code"), 10, 64)
	if err != nil {
		http.Error(w, "缺少关键性参数code", -1)
		return
	}
	// 调用函数并且获得返回数据
	rsp, err := client.GetAreaByStreet(context.Background(), &GETAREA.RequestStreet{Code: code})
	if err != nil {
		http.Error(w, err.Error(), 502)
		return
	}
	// 创建返回数据map
	response := map[string]interface{}{
		"code": rsp.Code,
		"msg":  rsp.Msg,
		"data": rsp.Data,
	}
	w.Header().Set("Content-Type", "application/json")
	// 将返回数据map发送给前端
	if err := json.NewEncoder(w).Encode(response); err != nil {
		http.Error(w, err.Error(), 503)
		return
	}
}

// GetAreas 结构化数据
func GetAreas(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
	utils.AlyLog("Get", "获取地区请求客户端 url : api/v1.0/areas/GetAreas")
	//logs.Info("---------------- 获取地区请求客户端 url : api/v1.0/areas/GetAreas ----------------")

	// 创建新的句柄
	service := micro.NewService()
	// 服务初始化
	service.Init()

	// 创建获取地区的服务并且返回句柄
	client := GETAREA.NewGetAreaService("go.micro.srv.GetArea", service.Client())

	// 获取前端发送过来的区域码
	code, err := strconv.ParseInt(ps.ByName("code"), 10, 64)
	if err != nil {
		http.Error(w, "缺少关键性参数code", -1)
		return
	}
	level, err := strconv.ParseInt(ps.ByName("level"), 10, 64)
	if err != nil {
		http.Error(w, "缺少关键性参数level", -1)
		return
	}
	// 调用函数并且获得返回数据
	rsp, err := client.GetAreas(context.Background(), &GETAREA.Request{Level: level, Code: code})
	if err != nil {
		http.Error(w, err.Error(), 502)
		return
	}
	// 创建返回数据map
	response := map[string]interface{}{
		"code": rsp.Code,
		"msg":  rsp.Msg,
		"data": rsp.Data,
	}
	w.Header().Set("Content-Type", "application/json")
	// 将返回数据map发送给前端
	if err := json.NewEncoder(w).Encode(response); err != nil {
		http.Error(w, err.Error(), 503)
		return
	}
}
